0447. 回旋镖的数量【中等】
1. 📝 题目描述
给定平面上 n 对 互不相同 的点 points,其中 points[i] = [xi, yi]。回旋镖 是由点 (i, j, k) 表示的元组,其中 i 和 j 之间的欧式距离和 i 和 k 之间的欧式距离相等(需要考虑元组的顺序)。
返回平面上所有回旋镖的数量。
示例 1:
txt
输入:points = [[0,0],[1,0],[2,0]]
输出:2
解释:两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]1
2
3
2
3
示例 2:
txt
输入:points = [[1,1],[2,2],[3,3]]
输出:21
2
2
示例 3:
txt
输入:points = [[1,1]]
输出:01
2
2
提示:
n == points.length1 <= n <= 500points[i].length == 2-10^4 <= xi, yi <= 10^4- 所有点都 互不相同
2. 🎯 s.1 - 哈希表
c
#define HASH_SIZE 2003
typedef struct Entry { int key; int val; struct Entry* next; } Entry;
Entry* table[HASH_SIZE];
void clearTable() {
for (int i = 0; i < HASH_SIZE; i++) {
Entry* e = table[i];
while (e) { Entry* t = e; e = e->next; free(t); }
table[i] = NULL;
}
}
void addOne(int key) {
int idx = ((unsigned int)key) % HASH_SIZE;
for (Entry* e = table[idx]; e; e = e->next)
if (e->key == key) { e->val++; return; }
Entry* e = (Entry*)malloc(sizeof(Entry));
e->key = key; e->val = 1; e->next = table[idx]; table[idx] = e;
}
int numberOfBoomerangs(int** points, int pointsSize, int* pointsColSize) {
int res = 0;
for (int i = 0; i < pointsSize; i++) {
memset(table, 0, sizeof(table));
for (int j = 0; j < pointsSize; j++) {
int dx = points[i][0] - points[j][0];
int dy = points[i][1] - points[j][1];
addOne(dx * dx + dy * dy);
}
for (int k = 0; k < HASH_SIZE; k++)
for (Entry* e = table[k]; e; e = e->next)
res += e->val * (e->val - 1);
clearTable();
}
return res;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
js
/**
* @param {number[][]} points
* @return {number}
*/
var numberOfBoomerangs = function (points) {
let res = 0
for (const p of points) {
const map = new Map()
for (const q of points) {
const d = (p[0] - q[0]) ** 2 + (p[1] - q[1]) ** 2
map.set(d, (map.get(d) || 0) + 1)
}
for (const cnt of map.values()) res += cnt * (cnt - 1)
}
return res
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
py
class Solution:
def numberOfBoomerangs(self, points: List[List[int]]) -> int:
res = 0
for p in points:
dist = defaultdict(int)
for q in points:
d = (p[0] - q[0]) ** 2 + (p[1] - q[1]) ** 2
dist[d] += 1
for cnt in dist.values():
res += cnt * (cnt - 1)
return res1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 时间复杂度:
- 空间复杂度:
算法思路:
- 以每个点为中心,统计到其它所有点的距离
- 相同距离的点有
个,则产生 个回旋镖